import { Connection, Channel, Options } from "amqplib";
import { useMq } from "./useMq";
/**
 * 将消息发布到指定的队列。
 * 
 * 此函数首先尝试建立与消息队列服务的连接，然后在指定的队列中声明并发送消息。
 * 如果在操作过程中出现任何错误，函数将抛出异常。
 * 最后，无论操作成功还是失败，函数都会尝试关闭通道和连接。
 * 
 * @param queueName 队列的名称，消息将发送到这个队列。
 * @param msg 要发送的消息，必须是Buffer类型。
 * @param options 队列的声明选项，用于配置队列的属性。
 */
export async function publishToQueue(queueName: string, msg: Buffer, options: Options.AssertQueue) {
    let con: Connection | undefined = undefined;
    let channel: Channel | undefined = undefined;
    try {
        con = await useMq()
        channel = await con.createChannel()
        await channel.assertQueue(queueName, options).catch(e => console.error(e))
        return channel.sendToQueue(queueName, msg, {
            persistent: true
        });
    } catch (e) {
        console.error(e)
        throw e;
    } finally {
        if (channel) await channel.close().catch(e => console.error(e))
        if (con) await con.close().catch(e => console.error(e))
    }
}